// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init()
const db = cloud.database()
const _ = db.command
const MEMBERSHIPDISCOUNT = 0.7 //会员享受的最大折扣


// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
  let result = false //支付结果，true成功，false失败
  let errMsg = "" //如果支付失败，存储失败的提示信息
  /**
   * 1、获取用户信息（判断用户积分是否足够购买商品）
   * 2、获取用户等级（等级不一样，享受的折扣不一样）
   * 3、是不是会员
   */

  /**
   * 获取用户信息
   * 云函数是在服务端操作，对所有用户的数据都有操作权限
   * 在云函数中查询用户数据，需要添加openid的查询条件
   */
  let user = (await db.collection('user').where({
    _openid: wxContext.OPENID
  }).get()).data[0]
  /**
   * 获取用户级别，计算购买商品的折扣
   * 1) 如果是会员,享受7折优惠
   * 2) 不是会员,根据用户等级,享受对应的折扣
   */
  let discount = 1 //折扣比率
  let levels = (await db.collection('level').get()).data
  // 获取用户当前所属等级
  let userLevel = levels.filter(e => e.minGrowthValue <= user.growthValue && user.growthValue <= e.maxGrowthValue)[0]
  // 会员是否在有效期内(true:过期)
  let isMembershipExpired = user.memberExpDate < new Date()
  // 如果是会员,7折优惠
  if (!isMembershipExpired) {
    //设置小飒卡会员折扣 (7折)
    discount = MEMBERSHIPDISCOUNT
  } else if (userLevel.bonus.length == 3) {
    //设置用户等级对应的折扣 (userLevel对象中的bonus是对应的折扣比率)
    discount = userLevel.bonus[1].discount
  }
  //读取购买的商品
  let products = (await db.collection('product')
    .where({
      index: _.in(event.productsIndex)
      // index:_.in(['2575','2599'])
    })
    .get()).data
  //原价
  var totalPrice = 0
  //实际支付价格
  var paymentFee = 0
  for (var i in products) {
    totalPrice += parseInt(products[i].price)
    paymentFee += Math.ceil(parseInt(products[i].price) * discount)
  }
  if (user.point < paymentFee) {
    errMsg = "很抱歉，你的积分不足，无法购买"
  } else {
    //添加订单购买记录
    var orderId = (await db.collection('user_order')
      .add({
        data: {
          _openid: wxContext.OPENID, //云函数添加数据不会自动插入openid，需要手动定义
          date: db.serverDate(),
          productsIndex: event.productsIndex,
          totalPrice: totalPrice,
          paymentFee: paymentFee,
          discount: discount,
          memberExpDate: user.memberExpDate,
          userLevel: userLevel.id,
          userPoint: user.point,
          status: 'paid'
        }
      }))._id
    //添加已购买商品记录
    for (var i in products) {
      let res = await db.collection('user_paid')
        .add({
          data: {
            _openid: wxContext.OPENID, //云函数添加数据不会自动插入openid，需要手动定义
            date: db.serverDate(),
            productIndex: products[i].index,
            price: parseInt(products[i].price),
            paymentFee: Math.ceil(parseInt(products[i].price) * discount),
            discount: discount,
            orderId: orderId
          }
        })
    }
    //添加积分支付记录
    await db.collection('user_point')
      .add({
        data: {
          _openid: wxContext.OPENID, //云函数添加数据不会自动插入openid，需要手动定义
          date: db.serverDate(),
          changePoints: -1 * paymentFee,
          operation: "购买商品",
          timestamp: '',
          orderId: orderId
        }
      })
    //添加成长值记录
    await db.collection('user_growth_value')
      .add({
        data: {
          _openid: wxContext.OPENID, //云函数添加数据不会自动插入openid，需要手动定义
          date: db.serverDate(),
          changeGrowthValue: paymentFee,
          operation: "购买商品",
          timestamp: '',
          orderId: orderId,
          noteId: ''
        }
      })
    var newPoint = user.point - paymentFee //支付后剩余积分
    var newGrowthValue = user.growthValue + paymentFee //支付后新成长值
    //修改会员积分和成长值
    var updateUserResult = await db.collection('user')
      .where({
        //云函数是在服务端操作，对所有用户的数据都有操作权限
        //在云函数中查询用户数据，需要添加openid的查询条件
        _openid: wxContext.OPENID
      })
      .update({
        data: {
          point: newPoint,
          growthValue: newGrowthValue
        }
      })
    if (updateUserResult.stats.updated == 1) {
      result = true
    } else {
      errMsg = "支付异常，如有疑问请联系客服"
    }
  }
  return {
    data: result,
    errMsg: errMsg
  }
}